#include <54func.h>
typedef struct node_s
{
    int data;//数据域
    struct node_s * pNext;         //指针域
}node_t;
typedef struct link_s
{
    node_t *pHead;
    node_t *pTail;
}link_t;
//头插法：传入的是指针，要想改变指针的指向，那么接收指针参数的是二级指针
void headInsert(node_t ** ppHead,node_t ** ppTail,int data)
{
    //申请一个节点空间
    node_t * pNew = (node_t *)malloc(sizeof(node_t));//申请的是一个节点的大小，而不是一个节点指针的大小
    memset(pNew,0,sizeof(node_t));//将结点指针设置为NULL
    pNew->data = data;
    if( *ppHead == NULL)//指向第一个节点的指针为NULL,则链表为空
    {
        //将传入的头尾指针节点指向一个空节点
        *ppHead = pNew;
        *ppTail = pNew;
    }else{
        pNew->pNext = *ppHead;
        *ppHead = pNew;
    }
}
//尾插法：要想修改传入的参数，要用地址传递
void tailInset(node_t **ppHead,node_t **ppTail,int data)
{
    node_t * pNew = (node_t *)malloc(sizeof(node_t));//注意：这里申请的是一个结点的大小，而非是一个结点指针的大小
    memset(pNew,0,sizeof(node_t));
    pNew->data = data;
    if(ppHead == NULL) //如果是空链表
    {
        *ppHead = pNew;
        *ppTail = pNew;
    }else{
        (*ppTail)->pNext = pNew;
        *ppTail = pNew;
    }
}
void visitList(node_t *pHead)
{
    node_t * pCur = pHead;
    while(pCur){
        printf("%d ",pCur->data);
        pCur = pCur->pNext;
    }
    printf("\n");
}
//int main()
//{
//    node_t *pHead = NULL;//头指针
//    node_t *pTail = NULL;//尾指针
//    for(int i = 0;i<10;i++)
//    {
//       // headInsert(&pHead,&pTail,i);
//        tailInset(&pHead,&pTail,i);
//        visitList(pHead);
//    }
//    return 0;
//}
void *threadFunc(void * arg)
{
    //传入的是一个link_t结构体,因此需要强制类型转换为link_t
    link_t * p = (link_t *)arg;
    printf("I am child!\n");
    visitList(p->pHead);
    
    return NULL;
}
int main()
{
    //目标：在主线程中创建一个链表，并插入若干个节点，将其传递给子线程，子线程中遍历所有的链表节点
    //node_t *pHead = NULL;
    //node_t *pTail = NULL;
    link_t link;
    link.pHead = NULL;
    link.pTail = NULL;
    for(int i = 0;i < 10;i++)
    {
        headInsert(&link.pHead,&link.pTail,i);
    }
    pthread_t tid;
    //主线程需要将创建的链表传入的子线程
    int ret = pthread_create(&tid,NULL,threadFunc,&link);
    THREAD_ERROR_CHECK(ret,"pthread_t");
    sleep(1);
    return 0;
}
